Tenemos el siguiente programa, que se inspira en la escena de la película "The Matrix" donde Morfeo le ofrece una pastilla roja o una azul a Neo:
int main() { string respuesta; cout << "Quieres la pastilla roja? "; cin >> respuesta; if (respuesta == "no") { cout << "Vale, tu mandas."; } else { cout << "Bienvenido al mundo RREEAALL!"; } cout << endl; }
El programa pide si Quieres la pastilla roja y luego muestra una frase de acuerdo con tu elección.
Nuestro objetivo es, ahora, modificar el programa para que Morfeo se más insistente. Es decir, que no se dé por satisfecho si la respuesta es no y pregunte Estás seguro? para intentar que Neo diga que sí (porque si Neo dice no, se acaba la película).
Para conseguir esto, modificamos el programa de la siguiente manera:
int main() { string respuesta; cout << "Quieres la pastilla roja? "; cin >> respuesta; while (respuesta == "no") { cout << "Estás seguro? "; cin >> respuesta; } cout << "Bienvenido al mundo RREEAALL!" << endl; }
El if ha sido sustituido por while y se ha quedado con un solo bloque (el else ha desaparecido). La frase que había en el else ahora está al final del programa.
Veamos la estructura del while:
while (respuesta == "no") { cout << "Estás seguro? "; cin >> respuesta; }
Tiene estas partes:
El programa, ahora, es muy distinto que el de antes. De todas maneras, cuando se llega al while, también se evalúa la expresión respouesta == "no". Si la expresión es true (o sea la respuesta es "no") se entra en el cuerpo del while, que tiene dos instrucciones. Esas instrucciones se ejecutan, con el resultado de que se pregunta por pantalla Estás seguro? y se obtiene una nueva respuesta, y aquí viene la parte interesante: al acabar el bloque se vuelve al principio del ``while``.
Es decir, en un while el bloque de instrucciones que lo acompaña se ejecuta una y otra vez mientras que la expresión sea true.
El while también se comporta como el if cuando no lleva else: si la expresión Booleana da false se salta el bloque de instrucciones y el programa continúa con la siguiente. Incluso si la primera vez se llega al while la expresión es falsa, el cuerpo del while (el bloque) no se ejecuta.
El programa ahora se puede representar en forma de diagrama así
La flecha roja del diagrama es la importante. Así como el if nos permite escoger por dónde continua el programa, no vuelve hacia atrás. El while sí, y eso tiene implicaciones importantes.
Por ejemplo, qué sucede en el siguiente programa?
int main() { while (true) { cout << "Estoy rallado." << endl; } }
Si lo quieres probar, adelante, pero tendrás que parar el programa cerrando la ventana o algo así, porque este programa no para nunca. La condición es siempre cierta y por tanto aparecerá por pantalla un torrente de líneas con
Estoy rallado. Estoy rallado. Estoy rallado. ...
(El programa es un homenaje a los discos de vinilo, para quien los haya conocido.)
Por tanto, la evaluación del while es totalmente estricta y no es difícil poner una expresión Booleana mal pensada que siempre dé true y provocar lo que se denomina un "bucle infinito". Para el usuario, si un programa entra en un bucle infinito, se dice muchas veces que se "cuelga" o que deja de responder. No es frecuente pero casi todo el que usa un ordenador a menudo lo ha experimentado alguna vez.
Volviendo al programa sobre "The Matrix"
int main() { string respuesta; cout << "Quieres la pastilla roja? "; cin >> respuesta; while (respuesta == "no") { cout << "Estás seguro? "; cin >> respuesta; } cout << "Bienvenido al mundo RREEAALL!" << endl; }
Se puede ver ahora que para salir de este programa no hay más solución que contestar algo que no sea "no", de otra forma la tozudería de Morfeo es inacabable, está dispuesto a preguntar infinitas veces "Estás seguro?".
En preparación